/**
 * WeChat 和 uniapp 的图片上传方法
 * recursion1 和 recursion2 分别式两种上传方式，但两只都只调用的接口都只支持单张图片上传
 * recursion1 使用promise等待单张图片上传
 */


// 服务器域名
import {baseUrl} from '@/utils/base.js'
let api = baseUrl;
let network = 'http://82.156.205.64:8080/book'; //如果接口返回数据是相对路径需要向后台询问要拼接的域名

const baseData = {
  url: '', //开发者服务器地址
  data: {}, //开发接口所需其他参数
  imageUrl: [], //本地图片地址数组
  isSplit: false, //是否需要对数组进行分割 ，如果服务器返回有（大图，原图，缩略图）
}
// 处理传入数据
const formatData = (params) => {
  if (params.url.indexOf('http') == -1) params.url = api + params.url.replace(/\//, ''); //合并URL
  return params
}

// 调用微信API上传图片
// 判断如果该图片是网络图片直接返回
const upload = async (url, imageUrl, data) => {
  return await new Promise((resolve, reject) => {
    if (imageUrl.indexOf('http') > -1 && imageUrl.indexOf('http://tmp/') == -1) {
      resolve({
        data: imageUrl,
      })
    } else {
      uni.uploadFile({
        url: url, //仅为示例，非真实的接口地址
        filePath: imageUrl,
        name: 'file',
        formData: {
          ...data
        },
				header:{
					// "token": 'Bearer'+uni.getStorageSync('token') || '',
					"Authorization": ('Bearer' + uni.getStorageSync('token')) || '',
					// #ifndef H5
						"content-type": "multipart/form-data"
					// #endif
				},
        success: res => {
          resolve(JSON.parse(res.data))
        },
        fail: err => {
          console.log(err)
          reject(false)
        }
      })
    }
  })
};


// 两种写法 1.等待上传递归回调 2.promise.all同步上传
// 写法一.  上传提示 --- 等待上传 --- 删除首张图片 --- 处理本次上传（合并上传图片）--- 再次执行下张图片（递归） OR  循环完所有图片（返回结果）
const recursion1 = async (obj, fun, generateArr = []) => {
  if (obj.imageUrl.length) {
    uni.showLoading({
      title: `正在上传第${generateArr.length + 1}张图片`,
      mask: true
    });
    const _res = await upload(obj.url, obj.imageUrl[0], obj.data);
    obj.imageUrl.shift();
    if (_res) {
      console.log('%c请求结果:', 'color:green;', _res);
      const _data = network + _res.data
      if (obj.isSplit) {
        generateArr = [...generateArr, [_data.thumbImgUrl, _data.bigImgUrl, _data.sourceImgUrl].join(obj.ruleInside)] //该部分代码根据后台返回数据结构自行调正
      } else {
        generateArr = [...generateArr, _data]
      }
    };
    //递归
    await recursion1(obj, fun, generateArr)
  } else {
    uni.hideLoading()
    if (obj.isSplit) {
      return fun(generateArr.join(obj.ruleExtra))
    } else {
      return fun(generateArr)
    }
  }
}

// 写法二. Promise.all 将本地地址都转换成Promise对象 --- Promise.all等待执行完成返回结果
const recursion2 = async (obj, fun, generateArr = []) => {
  obj.imageUrl.map((v, i) => {
    obj.imageUrl[i] = new Promise((res, rej) => {
			if(obj.imageUrl[i].includes('/uploads/')){
				let index = obj.imageUrl[i].indexOf('/uploads/')
				// res({
				// 	url:obj.imageUrl[i].substring(index+9),  // 截取第几个根据接口实际情况进行处理
				// 	fullurl:obj.imageUrl[i]
				// })
				res(obj.imageUrl[i].substring(index+9))
			}else{
				let Authorization = obj?.token?'Bearer'+obj.token:'Bearer'+uni.getStorageSync('token')
				console.log(Authorization,'Authorization')
				uni.uploadFile({
				  url: baseUrl+'/login/Upload', //仅为示例，非真实的接口地址
				  filePath: obj.imageUrl[i],
				  name: 'file',
					header:{
						// "token": 'Bearer'+uni.getStorageSync('token') || '',
						// "Authorization": obj?.token? ('Bearer' + uni.getStorageSync('token')) || '',
						Authorization,
						// #ifndef H5
							"content-type": "multipart/form-data"
						// #endif
					},
				  success: (reslove) => {
						console.log(JSON.parse(reslove.data),'+++++++++++')
				    // let img = network + JSON.parse(reslove.data).data;
				    // res(img);
						res(JSON.parse(reslove.data).data)
				  },
					fail:(err)=>{
						console.log(err,'cuole')
					}
				})
			}
     
			
			
    })
  });
  Promise.all([...obj.imageUrl]).then(res => {
    return fun(res)
  }).catch(err => {
    console.log(err)
  })
}






const uploadFile = async (params) => {
	uni.showLoading({
		title:'上传中...',
		mask:true
	})
  return await new Promise((resolve, reject) => {
    let _data = formatData({
      ...baseData,
      ...params
    })
    recursion2(_data, res => {
      resolve(res)
    })
  })
}




export {
  uploadFile
}